/* * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.wso2.carbon.device.mgt.iot.sensebot.api; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.iot.common.devicecloud.DeviceController; import org.wso2.carbon.device.mgt.iot.common.devicecloud.exception.UnauthorizedException; import org.wso2.carbon.device.mgt.iot.sensebot.api.util.DeviceJSON; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.util.HashMap; import java.util.Map; public class SensebotControllerService { private static Log log = LogFactory.getLog(SensebotControllerService.class); private static final Map<String, String> deviceIPList = new HashMap<String, String>(); private static HttpURLConnection httpConn; private static final String URL_PREFIX = "http://"; private static final String FORWARD_URL = "/move/F"; private static final String BACKWARD_URL = "/move/B"; private static final String LEFT_URL = "/move/L"; private static final String RIGHT_URL = "/move/R"; private static final String STOP_URL = "/move/S"; @Path("/forward") @POST public String moveForward(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId, @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) { String result = null; result = sendCommand(deviceIp, deviceServerPort, FORWARD_URL); return result; } @Path("/backward") @POST public String moveBackward(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId, @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) { String result = null; result = sendCommand(deviceIp, deviceServerPort, BACKWARD_URL); return result; } @Path("/left") @POST public String turnLeft(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId, @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) { String result = null; result = sendCommand(deviceIp, deviceServerPort, LEFT_URL); return result; } @Path("/right") @POST public String turnRight(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId, @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) { String result = null; result = sendCommand(deviceIp, deviceServerPort, RIGHT_URL); return result; } @Path("/stop") @POST public String stop(@HeaderParam("owner") String owner, @HeaderParam("deviceId") String deviceId, @FormParam("ip") String deviceIp, @FormParam("port") int deviceServerPort) { String result = null; result = sendCommand(deviceIp, deviceServerPort, STOP_URL); return result; } @Path("/pushsensordata") @POST @Consumes(MediaType.APPLICATION_JSON) public void pushAlarmData( final DeviceJSON dataMsg, @Context HttpServletResponse response) { boolean result = false; String sensorValues = dataMsg.value; //TEMP-PIR-SONAR-LDR log.info("Recieved Sensor Data Values: " + sensorValues); String sensors[] = sensorValues.split(":"); try { if (sensors.length == 4) { String temperature = sensors[0]; String motion = sensors[1]; String sonar = sensors[2]; String light = sensors[3]; if (sonar.equals("-1")) { sonar = "No Object"; } sensorValues = "Temperature:" + temperature + "C\t\tMotion:" + motion + "\tSonar:" + sonar + "\tLight:" + light; if (log.isDebugEnabled()) log.debug(sensorValues); result = DeviceController .pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId, System.currentTimeMillis(), "DeviceData", temperature, "TEMP"); if (!result) { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } result = DeviceController .pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId, System.currentTimeMillis(), "DeviceData", motion, "MOTION"); if (!result) { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } if (!sonar.equals("No Object")) { result = DeviceController .pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId, System.currentTimeMillis(), "DeviceData", sonar, "SONAR"); if (!result) { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } } result = DeviceController .pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId, System.currentTimeMillis(), "DeviceData", light, "LIGHT"); if (!result) { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } } else { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } } catch (UnauthorizedException e) { response.setStatus(HttpStatus.SC_UNAUTHORIZED); } } @Path("/pushtempdata") @POST @Consumes(MediaType.APPLICATION_JSON) public void pushTempData( final DeviceJSON dataMsg, @Context HttpServletResponse response) { String temperature = dataMsg.value; //TEMP-PIR-SONAR-LDR if (log.isDebugEnabled()) log.debug("Recieved Tenperature Data Value: " + temperature + " degrees C"); try { boolean result = DeviceController .pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId, System.currentTimeMillis(), "DeviceData", temperature, "TEMP"); if (!result) { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } } catch (UnauthorizedException e) { response.setStatus(HttpStatus.SC_UNAUTHORIZED); } } @Path("/pushpirdata") @POST @Consumes(MediaType.APPLICATION_JSON) public void pushPIRData(final DeviceJSON dataMsg, @Context HttpServletResponse response) { String motion = dataMsg.value; //TEMP-PIR-SONAR-LDR if (log.isDebugEnabled()) log.debug("Recieved PIR (Motion) Sensor Data Value: " + motion); try { boolean result = DeviceController .pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId, System.currentTimeMillis(), "DeviceData", motion, "MOTION"); if (!result) { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } } catch (UnauthorizedException e) { response.setStatus(HttpStatus.SC_UNAUTHORIZED); } } @Path("/pushsonardata") @POST @Consumes(MediaType.APPLICATION_JSON) public void pushSonarData( final DeviceJSON dataMsg, @Context HttpServletResponse response) { String sonar = dataMsg.value; //TEMP-PIR-SONAR-LDR if (sonar.equals("-1")) { if (log.isDebugEnabled()) log.debug("Recieved a 'No Obstacle' Sonar value. (Means there are no abstacles within 30cm)"); } else { if (log.isDebugEnabled()) log.debug("Recieved Sonar Sensor Data Value: " + sonar + " cm"); try { boolean result = DeviceController .pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId, System.currentTimeMillis(), "DeviceData", sonar, "SONAR"); if (!result) { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } } catch (UnauthorizedException e) { response.setStatus(HttpStatus.SC_UNAUTHORIZED); } } } @Path("/pushlightdata") @POST @Consumes(MediaType.APPLICATION_JSON) public void pushlightData( final DeviceJSON dataMsg, @Context HttpServletResponse response) { String light = dataMsg.value; //TEMP-PIR-SONAR-LDR if (log.isDebugEnabled()) log.debug("Recieved LDR (Light) Sensor Data Value: " + light); try { boolean result = DeviceController .pushData(dataMsg.owner, "SenseBot", dataMsg.deviceId, System.currentTimeMillis(), "DeviceData", light, "LIGHT"); if (!result) { response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); return; } } catch (UnauthorizedException e) { response.setStatus(HttpStatus.SC_UNAUTHORIZED); } } private String sendCommand(String deviceIp, int deviceServerPort, String motionType) { if (deviceServerPort == 0) { deviceServerPort = 80; } String urlString = URL_PREFIX + deviceIp + ":" + deviceServerPort + motionType; if (log.isDebugEnabled()) log.debug(urlString); String result = ""; URL url = null; int responseCode = 200; try { url = new URL(urlString); } catch (MalformedURLException e) { log.error("Invalid URL: " + urlString); } try { if (url != null) { httpConn = (HttpURLConnection) url.openConnection(); try { httpConn.setRequestMethod(HttpMethod.GET); httpConn.setRequestProperty("User-Agent", "WSO2 Carbon Server"); responseCode = httpConn.getResponseCode(); result = "" + responseCode + HttpStatus.getStatusText(responseCode) + "(No reply from Robot)"; if (log.isDebugEnabled()) log.debug("\nSending 'GET' request to URL : " + urlString); if (log.isDebugEnabled()) log.debug("Response Code : " + responseCode); } catch (ProtocolException e) { log.error("Protocol mismatch exception occured whilst trying to 'GET' resource"); } catch (IOException e) { log.error( "Error occured whilst reading return code from server. This could be because the server did not return anything"); result = "" + responseCode + " " + HttpStatus.getStatusText(responseCode) + "(No reply from Robot)"; return result; } } } catch (IOException e) { log.error("Error Connecting to HTTP Endpoint at: " + urlString); } return result; } }